package br.com.tiespec.model.Util;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.mail.Session;
import javax.naming.InitialContext;

import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;

public class EmailUtil {
	
	private static final String JNDI_MAIL = "mail/tiespec";
	
	private List<String> destinatarios;
	private String mensagem = "";
	private List<String> responderPara;
	private List<String> comCopia;
	private List<String> comCopiaOculta;
	private String titulo;
	private List<AnexoEmail> anexos;

	private Session logar(){
		try {
			InitialContext ctx = new InitialContext();
			Session session = (Session) ctx.lookup(JNDI_MAIL);
			return session;
		} catch (Exception e) {
			System.out.println("ERRO: Pegar sessao JavaMail -> " + JNDI_MAIL);
		}
		return null;
	}
	
	public void send() throws Exception {
		
		validarDados();
		
		try {
			HtmlEmail email = new HtmlEmail();
			email.setCharset("UTF-8");
			email.setMailSession(logar());
			email.setFrom("no-reply@tiespec.com.br");
			
			if (destinatarios != null && destinatarios.size() > 0)
				for (String s:destinatarios){
					System.err.println(s);
					email.addTo(s);
				}
					
			if (comCopia != null && comCopia.size() > 0)
				for (String s:comCopia){
					System.err.println(s);
					email.addCc(s);
				}
					
			
			if (comCopiaOculta != null && comCopiaOculta.size() > 0)
				for (String s:comCopiaOculta){
					System.err.println(s);
					email.addBcc(s);
				}
					
			if (responderPara != null && responderPara.size() > 0)
				for (String s:responderPara){
					System.err.println(s);
					email.addReplyTo(s);
				}
					
			email.setSubject(titulo);
			email.setHtmlMsg(mensagem);
			
			//TODO Colocar as coisas referentes a anexos de emails, adicionando-os na mensagem
			
			email.send();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	private void validarDados() throws EmailException {
		if (this.destinatarios.size() < 1)
			throw new EmailException("ERRO_SEM_DESTINATARIO");
		if (this.responderPara.size() < 1)
			throw new EmailException("ERRO_SEM_RESPONDER_PARA");
		if (this.titulo == null || this.titulo.trim().length() == 0)
			throw new EmailException("ERRO_SEM_TITULO");
		if (this.mensagem == null || this.mensagem.trim().length() == 0)
			throw new EmailException("ERRO_SEM_MENSAGEM");
	}
	
	public void adicionarDestinatario(String... destinatarios){
		if (destinatarios == null)
			return;
		for (String s:destinatarios){
			if (!this.destinatarios.contains(s))
				this.destinatarios.add(s);
		}
	}
	
	public void adicionarResponderPara(String... responderPara){
		if (responderPara == null)
			return;
		for (String s:responderPara){
			if (!this.responderPara.contains(s))
				this.responderPara.add(s);
		}
	}
	
	/**
	 * Classe Para Trabalhar com Anexos Nos Emails
	 * @author Hermann Miertschink Neto
	 */
	public class AnexoEmail {
		
		private String nomeAnexo;
		private String contetType;
		private byte[] bytes;
		
		public String getNomeAnexo() {
			return nomeAnexo;
		}
		public void setNomeAnexo(String nomeAnexo) {
			this.nomeAnexo = nomeAnexo;
		}
		public String getContetType() {
			return contetType;
		}
		public void setContetType(String contetType) {
			this.contetType = contetType;
		}
		public byte[] getBytes() {
			return bytes;
		}
		public void setBytes(byte[] bytes) {
			this.bytes = bytes;
		}
	}

	public EmailUtil() {
		destinatarios = new ArrayList<String>();
		responderPara = new ArrayList<String>();
		comCopia = new ArrayList<String>();
		comCopiaOculta = new ArrayList<String>();
		anexos = new ArrayList<EmailUtil.AnexoEmail>();
	}
	
	public List<String> getDestinatarios() {
		return destinatarios;
	}
	
	public void setDestinatarios(List<String> destinatarios) {
		this.destinatarios = destinatarios;
	}
	
	public String getMensagem() {
		return mensagem;
	}
	
	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}
	
	public List<String> getResponderPara() {
		return responderPara;
	}
	
	public void setResponderPara(List<String> responderPara) {
		this.responderPara = responderPara;
	}
	
	public List<String> getComCopia() {
		return comCopia;
	}
	
	public void setComCopia(List<String> comCopia) {
		this.comCopia = comCopia;
	}
	
	public List<String> getComCopiaOculta() {
		return comCopiaOculta;
	}
	
	public void setComCopiaOculta(List<String> comCopiaOculta) {
		this.comCopiaOculta = comCopiaOculta;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public List<AnexoEmail> getAnexos() {
		return anexos;
	}

	public void setAnexos(List<AnexoEmail> anexos) {
		this.anexos = anexos;
	}

	public boolean add(AnexoEmail anexo) {
		return anexos.add(anexo);
	}

	public boolean addAll(Collection<? extends AnexoEmail> anexo) {
		return anexos.addAll(anexo);
	}
}